﻿using System;
using System.Configuration;
using System.Reflection;
using System.ServiceProcess;
using System.Timers;
using ClickLand.CorporacionPlaza.Comunes.Recursos;
using ClickLand.CorporacionPlaza.LogicaNegocio.Logica;
using Logger;

namespace Actualizador
{
    /// <summary> Servicio que actualiza los estados de los contratos y polizas
    /// cuando se vencen </summary>
    public partial class Actualizador : ServiceBase
    {

        #region Atributos

        private readonly Timer _tiempo;
        private readonly LogicaCorporacionPlaza _logica;
        #endregion

        #region Contructor


        // main entry point that creates the service object
        public static void Main()
        {
            Run(new Actualizador());
        }


        /// <summary> Constructor del servicio </summary>
        public Actualizador()
        {
            InitializeComponent();

            _tiempo = new Timer(Convert.ToDouble(ConfigurationManager.AppSettings["TiempoEjecucion"])); //ejecuta cada un dia
            _logica = new LogicaCorporacionPlaza();
            _tiempo.Elapsed += TiempoElapsed;
        }

        #endregion

        #region Eventos
        

        /// <summary> Metodo que se ejecuta cuando se inicia el servicio  </summary>
        /// <param name="args">Argumentos de inicializacion</param>
        protected override void OnStart(string[] args)
        {

            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            _logica.ActualizarEstados();
            _tiempo.Start(); //Iniciamos el timer

            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
        }


        /// <summary> Metodo que se ejecuta cuando se detiene el servicio </summary>
        protected override void OnStop()
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            _tiempo.Stop();
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
        }


        /// <summary> Metodo que se encarga de ejecutar el tiempo del servicio </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TiempoElapsed(object sender, ElapsedEventArgs e)
        {

            try
            {
                _tiempo.Enabled = false;
                _logica.ActualizarEstados();
                _tiempo.Enabled = true;
            }
            catch (Exception ex)
            {
                System.Diagnostics.EventLog.WriteEntry("Application", "Exception: " + ex.Message);
            }    
        }

        #endregion
    }
}
